Docker Compose:多容器应用的一站式管理工具
在微服务架构中,一个应用往往由多个容器(如 Web 服务、数据库、缓存等)组成,手动管理这些容器的启动、网络配置和依赖关系极为繁琐。Docker Compose 作为 Docker 官方的多容器管理工具,通过一个配置文件(docker-compose.yml)定义所有服务,再通过简单命令实现容器的批量创建、启动、停止等操作,大幅简化了多容器应用的部署流程。
Docker Compose 核心功能
Docker Compose 的核心价值在于简化多容器协同管理,主要功能包括:
- 通过单一配置文件定义所有服务的参数(镜像、端口、网络、数据卷等);
- 一键创建 / 启动所有服务(自动处理容器依赖和网络连接);
- 统一管理容器的生命周期(启动、停止、重启、删除等);
- 支持容器扩缩容、日志查看等运维操作。
常用命令详解
Docker Compose 命令需在 docker-compose.yml 所在目录执行,核心命令如下:
1. 查看版本
1
| docker-compose --version
|
2. 创建并启动所有服务
1 2 3 4 5 6 7 8
| # 前台启动(日志输出到控制台,Ctrl+C停止) docker-compose up
# 后台启动(推荐生产环境) docker-compose up -d
# 重建镜像并启动(适用于服务配置或Dockerfile修改后) docker-compose up -d --build
|
3. 停止并删除容器、网络(保留数据卷)
4. 启动 / 停止 / 重启服务
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 启动所有已创建的服务 docker-compose start
# 停止所有运行中的服务(不删除容器) docker-compose stop
# 重启所有服务 docker-compose restart
# 启动/停止/重启指定服务(如仅操作mysql) docker-compose start mysql docker-compose stop mysql docker-compose restart mysql
|
5. 查看运行中的容器
1 2 3 4
| docker-compose ps
# 查看所有服务(包括已停止的) docker-compose ps -a
|
6. 查看服务日志
1 2 3 4 5 6 7 8
| # 查看所有服务的实时日志 docker-compose logs -f
# 查看指定服务的日志(如nginx) docker-compose logs -f nginx
# 查看最近100行日志 docker-compose logs --tail=100
|
7. 进入容器内部
1 2 3
| docker-compose exec <服务名> <命令> # 示例:进入mysql容器的bash终端 docker-compose exec mysql /bin/bash
|
8. 服务扩缩容
1 2
| # 将web服务扩展到3个实例 docker-compose up -d --scale web=3
|
注意:仅适用于无状态服务,且需确保端口不冲突(避免固定端口映射)。
9. 删除停止的容器
docker-compose.yml 配置文件详解
docker-compose.yml 是 Docker Compose 的核心,用于定义所有服务的配置。其结构清晰,支持多版本语法(如 version: '3.8' 为最新稳定版),主要包含 services(服务)、networks(网络)、volumes(数据卷)等顶级节点。
核心配置项说明
1. services:定义服务列表
每个服务对应一个容器,包含镜像、端口、环境变量等配置。
| 配置项 |
作用说明 |
示例 |
image |
指定服务使用的镜像(本地不存在则自动拉取)。 |
image: mysql:8.0 |
build |
基于 Dockerfile 构建镜像(替代image)。 |
build: ./mysql(Dockerfile 所在目录) |
container_name |
指定容器名称(默认自动生成)。 |
container_name: my-mysql |
ports |
端口映射(宿主机端口:容器端口)。 |
- "3306:3306" |
volumes |
数据卷挂载(持久化数据)。 |
- ./data:/var/lib/mysql |
environment |
设置环境变量(键值对或列表形式)。 |
MYSQL_ROOT_PASSWORD: 123456 |
env_file |
从文件加载环境变量(每行一个KEY=VALUE)。 |
env_file: .env |
depends_on |
定义服务依赖(确保被依赖服务先启动)。 |
depends_on: [mysql, redis] |
command |
覆盖容器默认启动命令。 |
command: redis-server --appendonly yes |
restart |
容器重启策略(如always表示总是重启)。 |
restart: always |
networks |
为服务指定网络(默认使用默认网络)。 |
networks: - app-network |
2. networks:定义网络(可选)
用于自定义网络,实现服务间的隔离与通信:
1 2 3
| networks: app-network: driver: bridge
|
3. volumes:定义数据卷(可选)
用于持久化服务数据,支持命名卷和匿名卷:
1 2 3
| volumes: mysql-data: redis-data:
|
完整配置示例
以下是一个包含 Nacos、MySQL、Redis、Nginx 的微服务配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| version: '3.8'
services: nacos: container_name: nacos image: study/nacos/nacos-server:2 build: context: ./nacos environment: - MODE=standalone volumes: - ./nacos/logs/:/home/nacos/logs - ./nacos/conf/application.properties:/home/nacos/conf/application.properties ports: - "8848:8848" - "9848:9848" - "9849:9849" depends_on: - mysql restart: always
mysql: container_name: mysql image: study/mysql:5 build: context: ./mysql ports: - "3306:3306" volumes: - ./mysql/conf:/etc/mysql/conf.d - ./mysql/logs:/logs - ./mysql/data:/var/lib/mysql command: [ 'mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--default-time-zone=+8:00' ] environment: MYSQL_DATABASE: 'study' MYSQL_ROOT_PASSWORD: password restart: always
redis: container_name: redis image: study/redis build: context: ./redis ports: - "6379:6379" volumes: - ./redis/conf/redis.conf:/home/redis/redis.conf - ./redis/data:/data command: redis-server /home/redis/redis.conf restart: always
nginx: container_name: nginx image: study/nginx build: context: ./nginx ports: - "80:80" volumes: - ./nginx/html/dist:/home/work/www/study - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf - ./nginx/logs:/var/log/nginx restart: always
|
使用流程
- 编写配置文件:在项目根目录创建
docker-compose.yml,定义所有服务;
- 启动服务:执行
docker-compose up -d 后台启动所有服务;
- 查看状态:通过
docker-compose ps 确认服务是否正常运行;
- 运维操作:如需修改配置,更新
docker-compose.yml 后执行 docker-compose up -d 热更新;
- 停止服务:执行
docker-compose down 停止并清理容器(数据卷保留)。
优势与适用场景
优势
- 简化配置:一个文件管理所有服务,避免手动执行大量
docker 命令;
- 环境一致:确保开发、测试、生产环境的配置统一,减少 “环境差异” 问题;
- 依赖管理:自动处理服务启动顺序(通过
depends_on);
- 易于扩展:支持服务扩缩容和动态更新。
适用场景
- 本地开发环境:快速搭建多组件依赖的开发环境(如 Web+DB+Cache);
- 小规模部署:单机或少量服务器的应用部署;
- CI/CD 集成:与 Jenkins 等工具结合,实现自动化部署。
总结
Docker Compose 是多容器应用的 “瑞士军刀”,通过 docker-compose.yml 配置文件和简洁命令,实现了服务的一站式管理。其核心价值在于降低多容器协同的复杂度,让开发者和运维人员能更专注于业务逻辑而非容器操作